package com.life.xxx.util;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;

/**
 * 密码加密工具类
 * 提供生成随机盐、对密码进行SHA-256哈希加密的功能。
 */
public final class PasswordUtil {

    // 私有构造函数，防止外部实例化
    private PasswordUtil() {
        throw new AssertionError("工具类不能被实例化");
    }

    /**
     * 生成随机盐
     * @return 盐字符串 (16字节，32位十六进制)
     */
    public static String generateSalt() {
        SecureRandom random = new SecureRandom();
        byte[] saltBytes = new byte[16]; // 16字节的盐
        random.nextBytes(saltBytes);
        return bytesToHex(saltBytes);
    }

    /**
     * 使用给定的盐对密码进行SHA-256哈希
     * @param rawPassword 明文密码
     * @param salt 盐值
     * @return 加密后的密码 (64位十六进制字符串)
     * @throws NoSuchAlgorithmException 如果SHA-256算法不可用
     */
    public static String hashPassword(String rawPassword, String salt) throws NoSuchAlgorithmException {
        if (rawPassword == null || salt == null) {
            throw new IllegalArgumentException("密码和盐不能为空");
        }
        MessageDigest digest = MessageDigest.getInstance("SHA-256");
        byte[] encodedhash = digest.digest((rawPassword + salt).getBytes());
        return bytesToHex(encodedhash);
    }

    /**
     * 将字节数组转换为十六进制字符串
     * @param hash 要转换的字节数组
     * @return 十六进制字符串
     */
    private static String bytesToHex(byte[] hash) {
        StringBuilder hexString = new StringBuilder(2 * hash.length);
        for (byte b : hash) {
            String hex = Integer.toHexString(0xff & b);
            if (hex.length() == 1) {
                hexString.append('0');
            }
            hexString.append(hex);
        }
        return hexString.toString();
    }

    /**
     * 验证明文密码与存储的哈希值和盐是否匹配
     * @param rawPassword 明文密码
     * @param storedHash 存储的哈希值
     * @param salt 存储的盐
     * @return 是否匹配
     */
    public static boolean verifyPassword(String rawPassword, String storedHash, String salt) {
        try {
            String computedHash = hashPassword(rawPassword, salt);
            return computedHash.equals(storedHash);
        } catch (NoSuchAlgorithmException e) {
            // 理论上不会发生，但可以记录日志或抛出运行时异常
            throw new RuntimeException("SHA-256算法不可用", e);
        }
    }

//    public static void main(String[] args) throws Exception {
//        String salt = generateSalt();
//        String hashPassword = hashPassword("123456",salt);
//        System.out.println(hashPassword);
//        System.out.println(salt);
//        String s = JwtUtil.generateFinalSecret(hashPassword,salt);
//        System.out.println(s);
//    }
}
